﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WerewolfGMSupporter
{
    
    #region 列挙型の属性にラベル追加
    /// <summary>
    /// 列挙型を拡張子し、フィールドにラベル文字列を付加するカスタム属性です。
    /// </summary>
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
    public class LabeledEnumAttribute
        : Attribute
    {
        /// <summary>
        /// ラベル文字列。
        /// </summary>
        private string label;

        /// <summary>
        /// LabeledEnumAttribute クラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="label">ラベル文字列</param>
        public LabeledEnumAttribute(string label)
        {
            this.label = label;
        }

        /// <summary>
        /// 属性で指定されたラベル文字列を取得する。
        /// </summary>
        /// <param name="value">ラベル付きフィールド</param>
        /// <returns>ラベル文字列</returns>
        public static string GetLabel(Enum value)
        {
            Type enumType = value.GetType();
            string name = Enum.GetName(enumType, value);
            LabeledEnumAttribute[] attrs =
                (LabeledEnumAttribute[])enumType.GetField(name)
                .GetCustomAttributes(typeof(LabeledEnumAttribute), false);

            if (attrs.Length == 0)
                return "";
            return attrs[0].label;
        }

    }
    #endregion

    #region 拡張メソッド

    static class Extensions
    {
        /// <summary>
        /// 数値型の文字列だった場合カンマを振ります。
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string numberFormat(this string str)
        {
            long intval;
            if (long.TryParse(str, out intval))
            {
                return String.Format("{0:N0}", intval);
            }
            else return str;
        }

        /// <summary>
        /// enumのラベル属性を返します。
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string label(this Enum value)
        {
            return LabeledEnumAttribute.GetLabel(value);
        }
    }
    #endregion
}
